package com.atguigu.tingshu.album.api;

import com.atguigu.tingshu.album.service.TrackInfoService;
import com.atguigu.tingshu.album.service.VodService;
import com.atguigu.tingshu.common.annotation.login.LoginInfo;
import com.atguigu.tingshu.common.annotation.login.LoginRequired;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.query.album.TrackInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumTrackListVo;
import com.atguigu.tingshu.vo.album.TrackInfoVo;
import com.atguigu.tingshu.vo.album.TrackListVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 声音管理
 * @author sun
 */
@RestController
@RequestMapping("api/album/trackInfo")
public class TrackInfoController {

	@Resource
	private TrackInfoService trackInfoService;

	@Resource
	private VodService vodService;

	/**
	 * 上传声音
	 * @param file 声音
	 * @return map数据  mediaFileId 声音文件id 和 mediaUrl 声音文件url
	 */
	@PostMapping("uploadTrack")
	@LoginRequired
	public Result<Map<String, Object>> uploadTrack(MultipartFile file){
		return Result.ok(vodService.uploadTrack(file));
	}

	/**
	 * 新增声音
	 * @param trackInfoVo 声音的Vo信息
	 * @return 返回结果
	 */
	@PostMapping("saveTrackInfo")
	@LoginRequired
	public Result<Integer> saveTrackInfo(@RequestBody @Validated TrackInfoVo trackInfoVo){
		return Result.ok(trackInfoService.saveTrackInfo(trackInfoVo));
	}

	/**
	 * 根据条件分页查询声音
	 * @param page 页码
	 * @param size 每页记录数
	 * @param trackInfoQuery 查询条件
	 * @return 返回分页查询结果
	 */
	@PostMapping("findUserTrackPage/{page}/{size}")
	@LoginRequired
	public Result<IPage<TrackListVo>> findUserTrackPage(
			@PathVariable("page") Long page,
			@PathVariable("size") Long size,
			@RequestBody TrackInfoQuery trackInfoQuery
	){
		trackInfoQuery.setUserId(AuthContextHolder.getUserId());
		return Result.ok(
				trackInfoService.findUserTrackPage(new Page<>(page, size),
						trackInfoQuery)
		);
	}

	/**
	 * 根据声音id获取声音数据
	 * @param id 声音id
	 * @return 声音数据
	 */
	@GetMapping("getTrackInfo/{id}")
	@LoginRequired
	public Result<TrackInfo> getTrackInfo(@PathVariable("id") Long id){
		return Result.ok(trackInfoService.getById(id));
	}

	/**
	 * 修改声音
	 * @param id 声音id
	 * @param trackInfoVo 声音Vo
	 * @return 返回结果
	 */
	@PutMapping("updateTrackInfo/{id}")
	@LoginRequired
	public Result<Integer> updateById(@PathVariable("id") Long id,
									  @RequestBody @Validated TrackInfoVo trackInfoVo
	){

		return Result.ok(trackInfoService.updateTrack(id, trackInfoVo));
	}

	/**
	 * 删除声音
	 * @param id 声音id
	 * @return 返回结果
	 */
	@DeleteMapping("removeTrackInfo/{id}")
	@LoginRequired
	public Result<Integer> removeTrackInfo(@PathVariable("id") Long id){
		return Result.ok(trackInfoService.removeTrack(id));
	}

	/**
	 * 根据专辑id查询专辑下的声音
	 * @param page 页码
	 * @param size 每页记录数
	 * @param albumId 专辑id
	 * @return 返回分页查询结果
	 */
	@GetMapping("findAlbumTrackPage/{albumId}/{page}/{size}")
	@LoginInfo
	public Result<IPage<AlbumTrackListVo>> findAlbumTrackPage(
			@PathVariable("page") Long page,
			@PathVariable("size") Long size,
			@PathVariable("albumId") Long albumId
	){
		return Result.ok(
				trackInfoService.findAlbumTrackPage(new Page<>(page, size), albumId)
		);
	}

	/**
	 * 查询用户可以购买的声音
	 * @param trackId  声音id
	 * @return 返回结果
	 */
	@GetMapping("findUserTrackPaidList/{trackId}")
	@LoginRequired
	public Result<List<Map<String,Object>>> findUserTrackPaidList(@PathVariable("trackId") Long trackId){
		return Result.ok(trackInfoService.findUserTrackPaidList(trackId));
	}


}

